home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 051-075 / disk_056 / mcad / tdp / source / calc.c next >
C/C++ Source or Header  |  1992-05-06  |  5KB  |  148 lines

  1. /* calc.c */
  2. #include "tdp.h"
  3.  
  4. void calc()
  5. {
  6.    register USHORT i, ix, iy;
  7.    int npts, ymid, xmid;
  8.    register int *x_i, *y_i; /* ASSUMES THAT FFP AND int ARE BOTH 4 BYTES */
  9.    register FFP *x_f, *y_f; /* ASSUMES THAT FFP AND int ARE BOTH 4 BYTES */
  10.    FFP xd, yd, xmax, xmin, ymin, ymax, yfact;
  11.    register FFP *z_f;
  12.    FFP dist, tmpf, xscale, yscale, zdmax, zdmin, zscale, zsfact, zdoffset;
  13.    
  14.    /*** FIND DATA MAX ***/
  15.    npts = nxpts*nypts;
  16.    zdmax = -FFPLARGE; zdmin = FFPLARGE;
  17.    for (z_f = &zd[0]; z_f < &zd[0]+npts; z_f++)
  18.       {zdmax = max(zdmax,*z_f); zdmin = min(zdmin,*z_f);}
  19.    if (debug) {printf("zdmax = %f, zdmin = %f\n",zdmax,zdmin);}
  20.  
  21.    /*** SCALE ZD[] AND CENTER ABOUT ZERO ***/
  22.    zsfact = 1.;
  23.    zdoffset = (zdmax+zdmin)/2.;
  24.    zscale = zsfact * (FFP)min(nxpts,nypts);
  25.    tmpf = zdmax - zdmin;
  26.    if (abs(tmpf) >= FFPSMALL) zscale = zscale/tmpf; else zscale = 1.;
  27.    if (debug) printf("zscale = %f\n",zscale);
  28.    for (z_f = &zd[0]; z_f < &zd[0]+npts; z_f++)
  29.       *z_f = (*z_f - zdoffset) * zscale;
  30.  
  31.    /*** ROTATE, PROJECT ***/
  32.    sinp=sin(phi); cosp=cos(phi); sint=sin(theta); cost=cos(theta);
  33.    xmax = (ymax = -FFPLARGE); xmin = (ymin = FFPLARGE);
  34.    xmid = nxpts/2; ymid = nypts/2;
  35.    dist = 20. * (FFP)max(nxpts,nypts);
  36.    yfact = (FFP)nxpts / (FFP)nypts;
  37.  
  38.    for (iy = 0, z_f = &zd[0]; iy < nypts; iy++) {
  39.       for (/*init: */ ix = 0, x_f = (FFP *)&x[iy][0], y_f = (FFP *)&y[iy][0];
  40.            /*while:*/ ix < nxpts;
  41.            /*next: */ ix++, x_f++, y_f++, z_f++) {
  42.  
  43.          /*** MAKE COORDINATE NET ***/
  44.          yd = yfact * (FFP)(iy-ymid); xd = (FFP)(ix-xmid);
  45.  
  46.          /********************
  47.          * ROTATE ABOUT Z AXIS
  48.          * x' =  x * cos(phi) + y * sin(phi)
  49.          * y' = -x * sin(phi) + y * cos(phi)
  50.          * z' =  z
  51.          *****************************/
  52.          tmpf = -xd*sinp + yd*cosp;
  53.          xd = xd*cosp + yd*sinp;
  54.  
  55.          /************************
  56.          * ROTATE ABOUT NEW X AXIS
  57.          * x'' =  x'
  58.          * y'' = -y' * cos(theta) + z' * sin(theta)
  59.          * z'' = -y' * sin(theta) + z' * cos(theta)
  60.          *****************************/
  61.          yd = tmpf*cost + (*z_f) * sint;
  62.          *z_f = -tmpf * sint + (*z_f) *cost;
  63.  
  64.          /***********************
  65.          * PROJECT ONTO X,Y PLANE
  66.          * X =  x'' / (y'' + dist)
  67.          * Y =  z'' / (y'' + dist)
  68.          *****************************/
  69.          tmpf = max(FFPSMALL, dist+yd);
  70.          *y_f = *z_f / tmpf;
  71.          *x_f = xd / tmpf;
  72.          if (debug>1) printf("x = %f, y = %f\n", *x_f, *y_f);
  73.  
  74.          /*** ACCUMULATE MIN, MAX ***/
  75.          xmin = min(xmin,*x_f); xmax = max(xmax,*x_f);
  76.          ymin = min(ymin,*y_f); ymax = max(ymax,*y_f);
  77.       }
  78.    }
  79.    if (debug) {
  80.       printf("xmin,xmax,ymin,ymax");
  81.       printf("%f %f %f %f\n", xmin, xmax, ymin, ymax);
  82.    }
  83.  
  84.    /*** MAKE DATA FOR AXES ***/
  85.    if ((axes == 'y') || (axes == 'Y')) {
  86.  
  87.       xA[0] = (FFP)(-xmid);
  88.       xA[1] = (FFP)(nxpts-1-xmid);
  89.       xA[2] = xA[0];
  90.       xA[3] = xA[0];
  91.  
  92.       yA[0] = yfact * (FFP)(-ymid);
  93.       yA[1] = yA[0];
  94.       yA[2] = yfact * (FFP)(nypts-1-ymid);
  95.       yA[3] = yA[0];
  96.  
  97.       zA[0] = zdmin;
  98.       zA[1] = zA[0];
  99.       zA[2] = zA[0];
  100.       zA[3] = zdmax;
  101.  
  102.       x_f = &xA[0]; y_f = &yA[0]; z_f = &zA[0];
  103.       for (i=0; i<4; i++, x_f++, y_f++, z_f++) {
  104.          *z_f = (*z_f - zdoffset) * zscale;
  105.             /* rotate */
  106.          tmpf = -(*x_f) * sinp + (*y_f) * cosp;
  107.          *x_f = (*x_f) * cosp + (*y_f) * sinp;
  108.             /* rotate */
  109.          *y_f = tmpf * cost + (*z_f) * sint;
  110.          *z_f = -tmpf * sint + (*z_f) * cost;
  111.             /* project */
  112.          tmpf = max(FFPSMALL, dist+(*y_f));
  113.          *y_f = (*z_f) / tmpf;
  114.          *x_f = (*x_f) / tmpf;
  115.             /* accumulate min, max */
  116.          xmin = min(xmin,*x_f); xmax = max(xmax,*x_f);
  117.          ymin = min(ymin,*y_f); ymax = max(ymax,*y_f);
  118.       }
  119.    }
  120.  
  121.    /*** SCALE DATA FOR PLOT ***/
  122.    xscale = (yscale = 0.);
  123.    if (xmax > xmin) xscale = (FFP)(MAXHORIZ-20) / (xmax - xmin);
  124.    if (ymax > ymin) yscale = (FFP)(MAXVERT-20) / (ymax - ymin);
  125.    if (debug) printf("xscale = %f, yscale = %f\n", xscale, yscale);
  126.  
  127.    /* NOTE x_i and x_f point to same locations, same for y_i, y_f */
  128.    for (iy=0; iy<nypts; iy++) {
  129.       for (ix=0, x_f=(FFP *)&x[iy][0], y_f=(FFP *)&y[iy][0];
  130.            ix<nxpts;
  131.            ix++, x_f++, y_f++
  132.           ) {
  133.          x_i = (int *)x_f; y_i = (int *)y_f;
  134.          *x_i = 10 + (int) ((*x_f - xmin) * xscale);
  135.          *y_i = 10 + (int) ((*y_f - ymin) * yscale);
  136.          if (debug>1) printf("x,y %d, %d\n",*x_i,*y_i);
  137.       }
  138.    }
  139.  
  140.    if ((axes == 'y') || (axes == 'Y')) {
  141.       for (i=0; i<4; i++) {
  142.          xA_i[i] = 10 + (int) ((*x_f - xmin) * xscale);
  143.          yA_i[i] = 10 + (int) ((*y_f - ymin) * yscale);
  144.       }
  145.    }
  146. }
  147.  
  148.